#include <libunwind.h>

unw_word_t
_ReadSLEB (unsigned char **dpp)
{
    unsigned shift = 0;
    unw_word_t byte, result = 0;
    unsigned char *bp = *dpp;

    while (1)
    {
        byte = *bp++;
        result |= (byte & 0x7f) << shift;
        shift += 7;
        if ((byte & 0x80) == 0)
            break;
    }

    if (shift < 8 * sizeof (unw_word_t) && (byte & 0x40) != 0)
        /* sign-extend negative value */
        result |= ((unw_word_t) -1) << shift;

    *dpp = bp;
    return result;
}
